<!--
 * @Author: weidewei
 * @Date: 2025-10-30 10:00:01
 * @LastEditors: weidewei
 * @LastEditTime: 2025-10-30 11:56:10
 * @Description: 
 * @FilePath: \2025-front-face\review-knowledge\20251029\复习数据类型转换.html
-->
<script>
    // 1. 数字与字符串
    console.log(1 + "2") // "12"
    console.log("3" - 1) // 2
    console.log("4" * "2") // 8
    console.log("5" / "1") // 5

    // 2. 布尔值转换
    console.log(true + 1) // 2
    console.log(false + 1) // 1
    console.log(true + "1") //  "11"错 答案："true1" 忘记字符串要拼接的特殊情况
    console.log(false + "1") // "false1" 错 答案："false1" 忘记字符串要拼接的特殊情况

    // 3. null 和 undefined
    console.log(null == undefined) // true
    console.log(null === undefined) // true 错 答案：false 忘记比较了类型
    console.log(null + 1) // 1
    console.log(undefined + 1) // NaN

    // 4. 数组转换
    console.log([] + []) // 0 错 答案：'' 实际上是'' + ''
    console.log([] - []) // 0
    console.log([1] + [2]) // 3 错 答案："12" 以为是这样转换的Number([1]) + Number([2]) 实际上是把[1],[2]转成原始类型得到'1' 
    console.log([1] - [2]) // -1 

    // 5. 对象转换
    console.log({} + {}) // '[object Object][object Object]'
    console.log({} - {}) // NaN
    console.log({} + []) // '[object Object]'

    // 6. 混合类型
    console.log([] + {}) // '[object Object]'
    console.log({} + []) // '[object Object]'
    console.log([1,2] + {a:1}) // '1,2[object Object]'

    // 7. 双等号 vs 三等号
    console.log("5" == 5) // true
    console.log("5" === 5) // false
    console.log(0 == false) // true
    console.log(0 === false) // false
    console.log("" == false) // true
    console.log("" === false) // false

    // 8. 特殊值比较
    console.log(null == 0) // false
    console.log(null > 0) // false
    console.log(null >= 0) // true
    console.log(undefined == 0) // false

    // 9. 对象引用比较
    console.log([] == []) // false 因为对象比较的是地址
    console.log({} == {}) // false
    console.log([] == ![]) // true
    console.log({} == !{}) //  false

    // 10. 运算符优先级
    console.log([] == 0) // true
    console.log(![] == 0) // true
    console.log([] == ![]) // true
    console.log([] == []) // false

    // 11. 类型转换链
    console.log([] + {} + []) // '[object Object]'
    console.log({} + [] + {}) // '[object Object][object Object]'
    console.log([] + 1 + {}) // '1[object Object]'

    // 12. 边界情况
    console.log(+"123") // 123
    console.log(+"abc") // NaN
    console.log(+"") // 0
    console.log(+null) // 0
    console.log(+undefined) // NaN

    // 13. 预测输出结果
    let a = "5" - 2; // 3
    let b = "5" + 2; // "52"
    let c = "5" * "2"; // 10
    let d = "5" / "2"; // 2.5
    console.log(a, b, c, d); // 3 52 10 2.5

    // 14. 复杂表达式
    console.log(true + false + null + undefined + "" + [] + {}) //  "NaN[object Object]"

    // 15. 函数参数转换
    function test(x) {
        console.log(x + 1);
    }
    test("2"); // "21"
    test([]); // '1'
    test({}); // '[object Object]1'

    console.log('===================================================================================')

    // 布尔值转换巩固
    console.log(true + 2) // 3
    console.log(false + 2) // 2
    console.log(true - 1) // 0
    console.log(false - 1) // -1

    console.log(true + "hello") // 'truehello'
    console.log(false + "hello") // 'falsehello'
    console.log("hello" + true) // 'hellotrue'
    console.log("hello" + false) // 'hellofalse' 

    console.log(true + true + true) // 3
    console.log(false + false + false) // 0
    console.log(true + false + 1) // 2
    console.log(true + "2" + false) // true2false

    // null 和 undefined 巩固
    console.log(null + 5) // 5
    console.log(null - 5) // -5
    console.log(null * 5) // 0
    console.log(null / 5) // 0

    console.log(undefined + 5) // NaN
    console.log(undefined - 5) // NaN
    console.log(undefined * 5) // NaN
    console.log(undefined / 5) // NaN

    console.log(null + " world") // 'null world'
    console.log("hello " + null) // 'hello null'
    console.log(undefined + " world") // 'undefined world'
    console.log("hello " + undefined) // 'hello undefined'

    console.log(null == 0) // false
    console.log(null > 0)  // false
    console.log(null >= 0) // true
    console.log(undefined == 0) // false
    console.log(undefined > 0) // false

    // 第四组：数组转换巩固
    console.log([] + 5) // '5'
    console.log([] - 5) // -5
    console.log([] * 5) // 0
    console.log([] / 5) // 0

    console.log([3] + 2) // '32'
    console.log([3] - 2) // 1
    console.log([3] * 2) // 6
    console.log([3] / 2) // 1.5

    console.log([1,2] + 3) // '1,23'
    console.log([1,2] - 3) // NaN
    console.log([1,2] * 3) // NaN
    console.log([1,2] / 3) // NaN

    console.log([] + true) // 'true'
    console.log([] - true) // -1
    console.log([1] + false) // '1false'
    console.log([1] - false) // 1

    console.log([] + null) // 'null'
    console.log([] - null) // 0
    console.log([1] + undefined) // '1undefined'
    console.log([1] - undefined) // NaN

    console.log(true + null + []) // '1'
    console.log(false + undefined + [1]) // 'NaN1'
    console.log(null + undefined + []) // NaN


    console.log([] + 1 + 2) // '12'
    console.log([] + (1 + 2)) // '3'
    console.log([1] + 2 + 3) // '123'
    console.log([1] + (2 + 3)) // '15'

    

    
</script>